namespace Validation {
  export interface StringValidator {
    isAcceptable(s: string): boolean;
  }
  const lettersRegexp = /^[A-Za-z]+$/;
  const numberRegexp = /^[0-9]+$/;
  export class LettersOnlyValidator implements StringValidator {
    isAcceptable(s: string) {
      return lettersRegexp.test(s);
    }
  }
  export class ZipCodeValidator implements StringValidator {
    isAcceptable(s: string) {
      return s.length === 5 && numberRegexp.test(s);
    }
  }
}
// Some samples to try
let strings = ["Hello", "98052", "101"];
// Validators to use
let validators: {
  [s: string]: Validation. StringValidator;
} = {};
validators["ZIP code"] = new Validation. ZipCodeValidator();
validators["Letters only"] = new Validation. LettersOnlyValidator();
// Show whether each string passed each validator
for (let s of strings) {
  for (let name in validators) {
    console. log(`"${s}"-${validators[ name].isAcceptable(s) ? "matches" : "does not match"} ${name}`);
    /*
      "Hello"-does not match ZIP code
      "Hello"-matches Letters only
      "98052"-matches ZIP code
      "98052"-does not match Letters only
      "101"-does not match ZIP code
      "101"-does not match Letters only
    */
  }
}

